package modelo.AlgoHero;

import java.util.ArrayList;
import java.util.Iterator;
import org.w3c.dom.*;


public class Cancion implements Traducible {

	private ArrayList<Compas> compases;
	private Integer velocidad;
	
	
	/**
	 * Constructor de Cancion. 
	 * @param velocidad velocidad de los compases. 
	 * @autor Hernan G Gonzalez
	 */
	public Cancion (Integer velocidad){
		
		this.compases = new ArrayList <Compas> ();
		this.velocidad = velocidad;
	}
		
	/**
	 * Constructor de Cancion. 
	 *  @autor santiago di Tada
	 */
	public Cancion ( ){
		
		this.compases = new ArrayList <Compas> ();	
	}
	
	/**
	 * Recibe un nodo, que seria el de cancion y realiza la deserializacion de compas
	 *  @autor santiago di Tada
	 */
	public void Deserialize(Element cancionNode){		
		  NamedNodeMap attributes = cancionNode.getAttributes();
		  NodeList nodeList = cancionNode.getElementsByTagName("compas");
		  if(nodeList != null && nodeList.getLength() > 0) {
			  for(int i = 0 ; i < nodeList.getLength();i++) 
			  {			 
				  Compas compas = new Compas();
				  //System.out.println("Compas"+i);
				  compas.Deserialize((Element)nodeList.item(i));
				  this.compases.add(compas);				 	 			 
			  }
		  }
		  //aca se cargaria duracion, con estos datos
		  Figura figura = Figura.valueOf(attributes.getNamedItem("figura").getNodeValue());
		  Integer tiempo = Integer.decode(attributes.getNamedItem("cantFiguras").getNodeValue());
		  Duracion.setDuracion(figura,tiempo);
		  //System.out.println("la figura es: " +attributes.getNamedItem("figura").getNodeValue());
		  //System.out.println("la cantidad en compas es: " +attributes.getNamedItem("cantFiguras").getNodeValue());	
		  //esta es la duracion de la redonda
		  this.velocidad = Integer.getInteger(attributes.getNamedItem("valorRedonda").getNodeValue());
		  //System.out.println("duracion de redonda: " + attributes.getNamedItem("valorRedonda").getNodeValue());	
		}
	
	/**
	 * Metodo que se utiliza para traducir la cancion.
	 * Devuelve una instancia de la clase Cancion Traducida, conteniendo todos los 
	 * compases traducidos de la cancion.
	 */
	public ObjetoTraducido traducir() {
				
		CompasTraducido compasTraducido;
		
		CancionTraducida cancionTraducida = new CancionTraducida (this.velocidad);
		
		Iterator <Compas> i = this.compases.iterator();
		
		while (i.hasNext()){
			
			Compas compasAux;
			
			compasAux = i.next();

			compasTraducido = (CompasTraducido) compasAux.traducir();

			cancionTraducida.add(compasTraducido);
			

		}
		
		return cancionTraducida;
		
	}
	
	/**
	 * Metodo utilizado para agregar compases a la cancion 
	 * @param compas
	 * @author Hernan G Gonzalez
	 */
	public void add(Compas compas){
		
		this.compases.add(compas);
		
	}
	
	/**
	 * Metodo utilizado para saber si hay compases 
	 * @author santiago di Tada
	 */
	public boolean isEmpty(){
		return this.compases.isEmpty();
	}

}
